package com.huanzhidadi.single.compare;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

import java.util.*;

public class TreeMapSortTest2 {
    public static void main(String[] args) {
        testTreeMapAsc();
        testTreeMapDesc();
        testTreeMapValue();
    }

    /**
     * TreeMap集合，实现Value排序
     * 按照用户年龄降序
     * @author
     */
    public static void testTreeMapValue() {
        //创建 TreeMap 集合
        TreeMap<Integer,UserInfo> userTreeMap = new TreeMap<>();
        //获取用户信息列表
        userTreeMap.putAll(getUserMap());
        //通过ArrayList构造函数把map.entrySet()转换成list
        List<Map.Entry<Integer,UserInfo>> list = new ArrayList<Map.Entry<Integer,UserInfo>>(userTreeMap.entrySet());
        // 通过比较器来实现排序
        Collections.sort(list, new Comparator<Map.Entry<Integer,UserInfo>>() {
            @Override
            public int compare(Map.Entry<Integer,UserInfo> user1, Map.Entry<Integer,UserInfo> user2) {
                Integer age1 = user1.getValue().getAge();
                Integer age2 = user2.getValue().getAge();
                //按照用户年龄降序
                return age2.compareTo(age1);
            }
        });
        //遍历用户信息列表
        System.out.println("TreeMap集合，实现Value排序，按照用户年龄降序：");
        for (Map.Entry<Integer,UserInfo> mapping : list) {
            System.out.println("Key键：" + mapping.getKey());
            System.out.println("Value值：" + mapping.getValue());
        }
    }

    /**
     * TreeMap集合，实现Key降序
     * @author
     */
    public static void testTreeMapDesc() {
        //创建 TreeMap 集合，设置Key降序方法一：
        //TreeMap<Integer,UserInfo> userTreeMap = new TreeMap<>(Collections.reverseOrder());

        //创建 TreeMap 集合，设置Key降序方法二：
        TreeMap<Integer,UserInfo> userTreeMap = new TreeMap<Integer,UserInfo>(new Comparator<Integer>() {
            public int compare(Integer key1,Integer key2) {
                //降序排序
                return key2.compareTo(key1);
            }
        });
        //获取用户信息列表
        userTreeMap.putAll(getUserMap());
        //遍历用户信息列表
        System.out.println("TreeMap集合，实现Key降序：");
        for(Iterator<Integer> it = userTreeMap.keySet().iterator(); it.hasNext();) {
            int key = it.next();
            UserInfo value = userTreeMap.get(key);
            System.out.println("Key键：" + key);
            System.out.println("Value值：" + value);
        }
    }

    /**
     * TreeMap集合，实现Key升序
     * @author
     */
    public static void testTreeMapAsc() {
        //创建 TreeMap 集合 不指定排序器 默认升序
        TreeMap<Integer,UserInfo> userTreeMap = new TreeMap<>();
        //获取用户信息列表
        userTreeMap.putAll(getUserMap());
        //遍历用户信息列表
        System.out.println("TreeMap集合，实现Key升序：");
        for(Iterator<Integer> it = userTreeMap.keySet().iterator(); it.hasNext();) {
            int key = it.next();
            UserInfo value = userTreeMap.get(key);
            System.out.println("Key键：" + key);
            System.out.println("Value值：" + value);
        }
    }

    /**
     * 获取用户信息列表
     * @author pan_junbiao
     */
    private static Map<Integer,UserInfo> getUserMap() {
        Map<Integer,UserInfo> userMap = new HashMap<>();
        //创建用户信息
        UserInfo user1 = new UserInfo(1,"张三", 25);
        UserInfo user2 = new UserInfo(2,"李四", 18);
        UserInfo user3 = new UserInfo(3,"王五", 35);
        UserInfo user4 = new UserInfo(4,"赵六", 32);
        //将用户信息加入Map（故意打乱顺序）
        userMap.put(user4.getUserId(),user4);
        userMap.put(user2.getUserId(),user2);
        userMap.put(user3.getUserId(),user3);
        userMap.put(user1.getUserId(),user1);
        return userMap;
    }
}


@Data
@AllArgsConstructor
@ToString
class UserInfo {
    private int userId; //用户编号
    private String userName; //用户名称
    private int age; //年龄
}
